package gdf

import (
	"fmt"
	"net/http"
)

// setHeader 为http请求设置一系列特定的头部信息。
// 这些头部信息用于告诉服务器客户端的偏好和能力，以及一些浏览器相关信息。
// 参数:
//
//	req *http.Request: 需要设置头部信息的http请求对象。
//
// 返回值:
//
//	*http.Request: 已经设置了头部信息的http请求对象。
func setHeader(req *http.Request) *http.Request {
	// 设置客户端接受的文件类型，优先级从高到低。
	// 这告诉服务器客户端偏好接收哪种类型的响应数据。
	// 这些头部信息用于告诉服务器关于客户端的偏好和能力，例如接受的媒体类型、语言、浏览器类型等。
	// 这对于确保服务器以适当的方式响应请求非常重要。
	req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")

	// 设置客户端接受的语言类型，优先级从高到低。
	// 这告诉服务器客户端更倾向于哪种语言的响应内容。
	req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")

	// 设置连接类型为keep-alive，意味着客户端希望与服务器保持持久连接。
	// 这有助于减少建立新连接的开销，提高效率。
	req.Header.Set("Connection", "keep-alive")

	// 表明客户端支持不安全的升级请求。
	// 这在某些情况下用于升级HTTP连接到更安全的协议，如HTTPS。
	req.Header.Set("Upgrade-Insecure-Requests", "1")

	// 设置用户代理信息，模拟浏览器发送请求。
	// 这里模拟的是Chrome浏览器的用户代理，用于服务器识别客户端类型和版本。
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36")

	// 设置Chromium浏览器的相关信息，包括版本号和平台信息。
	// 这是新的浏览器标识方式，用于更详细地描述浏览器特征。
	req.Header.Set("Sec-Ch-Ua", "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"")

	// 设置浏览器运行的平台信息，这里是Windows。
	req.Header.Set("Sec-Ch-Ua-Platform", "\"Windows\"")

	// 返回设置了头部信息的请求对象。
	return req
}

// setHeaderRange 设置HTTP请求的Range头
// 该函数用于更新请求的Range头，以指定服务器返回的字节范围
// 参数:
//
//	req (*http.Request): HTTP请求对象，用于发送请求
//	start (int64): 请求的起始字节位置
//	stop (int64): 请求的结束字节位置
func setHeaderRange(req *http.Request, start, stop int64) {
	// 删除现有的Range头，以避免冲突
	req.Header.Del("Range")
	// 设置新的Range头，格式为"bytes=start-stop"
	req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", start, stop))
}
